#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <unistd.h>
typedef void (*pfunc)(); //函数指针类型

std::vector<pfunc> vfunc; //函数指针数组

void fun_one()
{
    printf("临时任务1\n");
}
void fun_two()
{
    printf("临时任务2\n");
}


void Load()
{
    vfunc.push_back(fun_one);
    vfunc.push_back(fun_two);
}

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程
        int cnt =  5;
        while(cnt)
        {
            printf("我是子进程: %d\n", cnt--);
            sleep(1);
        }

        exit(123); // 123: 测试 无意义
    }
    else
    {
        int quit = 0;

        while(!quit)
        {
            int status = 0;
            pid_t res = waitpid(-1, &status, WNOHANG); //非阻塞方式等待
            if(res > 0)
            {
                //函数调用成功 && 子进程已退出
                printf("等待子进程退出成功, 退出码: %d\n", WEXITSTATUS(status));
                quit = 1;
            }
            else if( res == 0 )
            {
                //函数调用成功 && 子进程未退出
                printf("子进程未退出，父进程可以处理其他事务\n");
                if(vfunc.empty()) 
                    Load();
                for(auto func : vfunc)
                {
                    func();
                }
            }
            else
            {
                //等待失败
                printf("函数调用失败!\n");
                quit = 1;
            }
            sleep(1);
        }
    }
}
